home *** CD-ROM | disk | FTP | other *** search
/ Savor the Moment - Entert…ing Without Reservations / Savoe the Moment - Entertaining Without Reservations.iso / pc / CookCommite.dxr / 00017_Custom Scrollbar.ls < prev    next >
Encoding:
Text File  |  1999-10-03  |  21.1 KB  |  602 lines

  1. property spriteNum, getPDLError, ourScrolledElement, myScrollRole, myActiveMember, myStandardMember, myMultiThreading, mySprite, myMember, myRect, myScrolledSprite, myScrolledMember, myActiveZone, myState, myNextUpdate, myZeroLoc, myDraggerShift, myClickV, myInterimShift, myMaxDraggerShift, myPageScroll, ourControlList, ourMaxScroll
  2.  
  3. on getBehaviorDescription me
  4.   return "CUSTOM SCROLL BAR" & RETURN & RETURN & "Create dynamic scrollbars with your own artwork.  Such scrollbars are not Direct-To-Stage, so other sprites can appear over the top of them." & RETURN & RETURN & "You will need to create four graphic members:" & RETURN & "+ up arrow" & RETURN & "+ down arrow" & RETURN & "+ dragger" & RETURN & "+ backing bar" & RETURN & RETURN & "You may wish to use two additional members, to indicate that the arrow buttons have been pressed:" & RETURN & "+ up arrow (pressed state)" & RETURN & "+ down arrow (pressed state)" & RETURN & RETURN & "Place the four standard members on the Stage, and drop this behavior onto each of them.  Choose how the current sprite is to act in the appropriate pop-up menu in the Behavior Parameters dialog." & RETURN & RETURN & "For each element you can choose whether animations should continue in the background.  This option will tend to slow both the animations and the scrolling process, especially if applied to the arrow buttons." & RETURN & RETURN & "The various sprites will position themselves automatically to the right of the sprite-to-be-scrolled when the movie runs.  They revert to their original positions when it stops.  To avoid flashes, it would be a good idea to position them by hand in their intended positions." & RETURN & RETURN & "If you use a border on your field members, the scrollbar will sit outside the border.  Field box shadows are not recommended.  You can always fake external borders and box shadows with shape members (this even gives you a choice of colors)." & RETURN & RETURN & "To make authoring easier, this behavior will continue to work if you change EITHER the sprite channel OR the member in the chosen channel.  If you change both, the behavior will no longer know what to scroll." & RETURN & RETURN & "If you do change either the sprite or the member, and then reopen the Behavior Parameters dialog for one of the elements, this will put that behavior out of synch with the others.  Simply reopen and close the Parameters dialogs for each of the other elements.  If you do not do so, you will receive multiple alerts." & RETURN & RETURN & "This behavior can be used to scroll both editable and non-editable Fields and Text members.  For editable members, however, it does not automatically update the dragger position when the length of the text changes, nor does it make the editable member scroll automatically when the user drags the mouse to create a selection." & RETURN & RETURN & "PERMITTED MEMBER TYPES:" & RETURN & PermittedMemberTypes(me) & RETURN & RETURN & "PARAMETERS:" & RETURN & "* Current sprite acts as (up|down arrow | dragger | bar)" & RETURN & "* Scroll the member of <sprite>: <the member of sprite>" & RETURN & "* Standard member (this should not need to be set)" & RETURN & "* Member to display when arrow buttons are pressed" & RETURN & "* Allow animations to continue" & RETURN & RETURN & "PUBLIC METHODS" & RETURN & "=> Scroll the text/field member to a given position" & RETURN & "=> Swap the text/field  member to be scrolled" & RETURN & "=> Get the behavior reference"
  5. end
  6.  
  7. on getBehaviorTooltip me
  8.   return " Use 4 graphic members (dragger, bar, up and down arrows)" & RETURN & "to create a dynamic scrollbar for Text or Field members." & RETURN & RETURN & "Drop this behavior on each sprite separately." & RETURN & RETURN & "Sprites can pass over the scrollbar and animations can" & RETURN & "continue while the user scrolls." & RETURN & RETURN & "The behavior accepts Lingo calls to:" & RETURN & "+ set the scrolltop of the scrolled member to a given value." & RETURN & "+ swap the current member of the sprite."
  9. end
  10.  
  11. on beginSprite me
  12.   StartInstallation(me)
  13. end
  14.  
  15. on prepareFrame me
  16.   if not myState + 0 then
  17.     FinishInstallation(me)
  18.   end if
  19.   if myMultiThreading then
  20.     UpdateScroll(me)
  21.   end if
  22. end
  23.  
  24. on mouseDown me
  25.   StartScroll(me)
  26. end
  27.  
  28. on mouseUp me
  29.   EndScroll(me)
  30. end
  31.  
  32. on mouseUpOutSide me
  33.   EndScroll(me)
  34. end
  35.  
  36. on StartInstallation me
  37.   mySprite = sprite(me.spriteNum)
  38.   myMember = mySprite.member
  39.   memberType = myMember.type
  40.   if voidp(myScrollRole) then
  41.     ErrorAlert(me, #getPDL_Invalid)
  42.   end if
  43.   myScrolledSprite = value(ourScrolledElement)
  44.   myScrolledMember = myScrolledSprite.member
  45.   memberType = myScrolledMember.type
  46.   case memberType of
  47.     #field, #text:
  48.     otherwise:
  49.       FindSprite(me)
  50.   end case
  51.   topLeft = point(myScrolledSprite.left, myScrolledSprite.top)
  52.   myRect = myScrolledSprite.rect - rect(topLeft, topLeft)
  53.   if memberType = #field then
  54.     if myScrolledMember.border then
  55.       myRect[1] = 1
  56.     end if
  57.   end if
  58.   ourMaxScroll = []
  59.   ourControlList = [:]
  60.   sendAllSprites(#CustomScrollbar_RollCall, ourScrolledElement, ourControlList, ourMaxScroll)
  61.   myState = 0
  62. end
  63.  
  64. on FindSprite me
  65.   saveDelimiter = the itemDelimiter
  66.   the itemDelimiter = ":"
  67.   memberData = ourScrolledElement.item[2]
  68.   the itemDelimiter = saveDelimiter
  69.   delete saveDelimiter.word[1]
  70.   delete saveDelimiter.char[1]
  71.   memberData = value(memberData)
  72.   myScrolledMember = member(memberData)
  73.   scrollSprite = the lastChannel
  74.   repeat while scrollSprite
  75.     if sprite(scrollSprite).member = myScrolledMember then
  76.       myScrolledSprite = sprite(scrollSprite)
  77.       exit
  78.     end if
  79.     scrollSprite = scrollSprite - 1
  80.   end repeat
  81.   if not scrollSprite then
  82.     ErrorAlert(me, #notScrollable, myScrolledSprite.member.type)
  83.   end if
  84. end
  85.  
  86. on FinishInstallation me
  87.   CheckControlList(me)
  88.   InstallElement(me)
  89. end
  90.  
  91. on CheckControlList me
  92.   checkList = duplicate(ourControlList)
  93.   roleList = [#upArrow, #downArrow, #dragger, #bar]
  94.   i = roleList.count()
  95.   repeat while i
  96.     theRole = roleList[i]
  97.     rolePosition = checkList.findPos(theRole)
  98.     if rolePosition then
  99.       roleList.deleteAt(i)
  100.       checkList.deleteAt(rolePosition)
  101.     end if
  102.     i = i - 1
  103.   end repeat
  104.   if checkList.count() then
  105.     ErrorAlert(me, #extraControl, checkList.getPropAt(1))
  106.   end if
  107.   if roleList.count() then
  108.     ErrorAlert(me, #missingControls, roleList)
  109.   end if
  110. end
  111.  
  112. on InstallElement me
  113.   scrollRoof = myScrolledSprite.top
  114.   scrollFloor = myScrolledSprite.bottom
  115.   scrollLeft = myScrolledSprite.right
  116.   if myScrolledMember.type = #field then
  117.     scrollLeft = scrollLeft - (myScrolledMember.border <> 0)
  118.   end if
  119.   case myScrollRole of
  120.     #upArrow:
  121.       mySprite.loc = point(scrollLeft, scrollRoof) + myMember.regPoint
  122.       myActiveZone = mySprite.rect
  123.     #downArrow:
  124.       locAdjust = myMember.regPoint - [0, mySprite.height]
  125.       rectAdjust = mySprite.rect - rect(mySprite.loc, mySprite.loc)
  126.       mySprite.loc = point(scrollLeft, scrollFloor) + locAdjust
  127.       myActiveZone = rectAdjust + rect(mySprite.loc, mySprite.loc)
  128.     #bar:
  129.       barRoof = scrollRoof + call(#SpriteHeight, ourControlList.upArrow)
  130.       barRight = scrollLeft + call(#spriteWIdth, ourControlList.upArrow)
  131.       barFloor = scrollFloor - call(#SpriteHeight, ourControlList.downArrow)
  132.       mySprite.rect = rect(scrollLeft, barRoof, barRight, barFloor)
  133.     #dragger:
  134.       case myMember.type of
  135.         #vectorShape:
  136.           regOffset = (myMember.strokeWidth + 1) / 2
  137.           myMember.regPoint = point(regOffset, regOffset)
  138.         otherwise:
  139.           myMember.regPoint = point(0, 0)
  140.       end case
  141.       upHeight = call(#SpriteHeight, ourControlList.upArrow)
  142.       upWidth = call(#SpriteHeight, ourControlList.upArrow)
  143.       downHeight = call(#SpriteHeight, ourControlList.downArrow)
  144.       draggerRoof = scrollRoof + upHeight
  145.       myZeroLoc = point(scrollLeft, draggerRoof)
  146.       barRight = scrollLeft + upWidth
  147.       myActiveZone = rect(scrollLeft, scrollRoof, barRight, scrollFloor)
  148.       myActiveZone = inflate(myActiveZone, 32, 32)
  149.       arrowAdjust = upHeight + downHeight
  150.       pageHeight = myScrolledSprite.height
  151.       scrollHeight = pageHeight - arrowAdjust
  152.       draggerHeight = mySprite.height
  153.       myMaxDraggerShift = 0
  154.       if scrollHeight < 0 then
  155.         minRect = myScrolledMember.rect
  156.         minRect[4] = arrowAdjust
  157.         myScrolledMember.rect = minRect
  158.         call(#InstallElement, ourControlList.bar)
  159.       end if
  160.       if scrollHeight < draggerHeight then
  161.         mySprite.loc = point(-999, -999)
  162.       else
  163.         if myScrolledMember.type = #field then
  164.           theMargin = myScrolledMember.margin
  165.           theMargin = theMargin - (theMargin mod 2)
  166.           borderAdjust = (myScrolledMember.border * 2) + theMargin
  167.         else
  168.           borderAdjust = 0
  169.         end if
  170.         myMaxDraggerShift = scrollHeight - draggerHeight + borderAdjust
  171.       end if
  172.       ourMaxScroll[1] = GetMaxScroll(me)
  173.       SetDraggerShift(me)
  174.   end case
  175.   myState = #done
  176. end
  177.  
  178. on GetMaxScroll me
  179.   pageHeight = myScrolledSprite.height
  180.   if myScrolledMember.type = #text then
  181.     lastChar = myScrolledMember.char.count
  182.     textHeight = charPosToLoc(myScrolledMember, lastChar)[2]
  183.   else
  184.     textHeight = myScrolledMember.height
  185.   end if
  186.   maxScroll = textHeight - pageHeight
  187.   if maxScroll < 1 then
  188.     return 0
  189.   else
  190.     return maxScroll
  191.   end if
  192. end
  193.  
  194. on StartScroll me
  195.   myState = #Active
  196.   ourMaxScroll[1] = GetMaxScroll(me)
  197.   case myScrollRole of
  198.     #dragger:
  199.       myClickV = (the clickLoc)[2]
  200.       myInterimShift = 0
  201.     #upArrow, #downArrow:
  202.       mySprite.member = myActiveMember
  203.     #bar:
  204.       draggerData = call(#GetDraggerData, ourControlList.dragger)
  205.       if (the clickLoc)[2] < draggerData.top then
  206.         myActiveZone = GetBarZone(me, draggerData, #Up)
  207.       else
  208.         myActiveZone = GetBarZone(me, draggerData, #down)
  209.       end if
  210.   end case
  211.   UpdateScroll(me)
  212.   if myMultiThreading then
  213.     exit
  214.   end if
  215.   repeat while the mouseDown
  216.     UpdateScroll(me)
  217.   end repeat
  218. end
  219.  
  220. on UpdateScroll me
  221.   case myState of
  222.     #Active:
  223.       if inside(the mouseLoc, myActiveZone) then
  224.         case myScrollRole of
  225.           #dragger:
  226.             MoveDragger(me)
  227.           #upArrow:
  228.             move(me, 1)
  229.           #downArrow:
  230.             move(me, 0)
  231.           #bar:
  232.             MoveBar(me)
  233.         end case
  234.       else
  235.         PauseScroll(me)
  236.       end if
  237.     #paused:
  238.       ResumeScroll(me)
  239.   end case
  240. end
  241.  
  242. on GetBarZone me, draggerData, pageScroll
  243.   if not voidp(pageScroll) then
  244.     myPageScroll = pageScroll
  245.   end if
  246.   barZone = mySprite.rect
  247.   if myPageScroll = #Up then
  248.     barZone[2] = myScrolledSprite.top
  249.     barZone[4] = draggerData.top
  250.   else
  251.     barZone[2] = draggerData.bottom
  252.     barZone[4] = myScrolledSprite.bottom
  253.   end if
  254.   return barZone
  255. end
  256.  
  257. on MoveDragger me
  258.   newScroll = myDraggerShift + the mouseV - myClickV
  259.   newScroll = max(0, min(newScroll, myMaxDraggerShift))
  260.   if myInterimShift = newScroll then
  261.     exit
  262.   end if
  263.   myInterimShift = newScroll
  264.   SetTextScroll(me, myInterimShift)
  265. end
  266.  
  267. on move me, Up
  268.   if the ticks < myNextUpdate then
  269.     exit
  270.   end if
  271.   if voidp(myNextUpdate) then
  272.     myNextUpdate = the ticks + 10
  273.   else
  274.     myNextUpdate = the ticks + 1
  275.   end if
  276.   if Up then
  277.     if not myScrolledMember.scrollTop then
  278.       exit
  279.     end if
  280.     scrollByLine(myScrolledMember, -1)
  281.   else
  282.     maxScroll = ourMaxScroll[1]
  283.     if myScrolledMember.scrollTop = maxScroll then
  284.       exit
  285.     end if
  286.     scrollByLine(myScrolledMember, 1)
  287.     if myScrolledMember.scrollTop > maxScroll then
  288.       myScrolledMember.scrollTop = maxScroll
  289.     end if
  290.   end if
  291.   call(#SetDraggerShift, ourControlList.dragger)
  292. end
  293.  
  294. on MoveBar me, Up
  295.   if the ticks < myNextUpdate then
  296.     exit
  297.   end if
  298.   myNextUpdate = the ticks + 10
  299.   if myPageScroll = #Up then
  300.     scrollByPage(myScrolledMember, -1)
  301.     if myScrolledMember.scrollTop then
  302.       scrollByLine(myScrolledMember, 1)
  303.     end if
  304.   else
  305.     maxScroll = ourMaxScroll[1]
  306.     if myScrolledMember.scrollTop = maxScroll then
  307.       exit
  308.     end if
  309.     scrollByPage(myScrolledMember, 1)
  310.     scrollByLine(myScrolledMember, -1)
  311.     if myScrolledMember.scrollTop > maxScroll then
  312.       myScrolledMember.scrollTop = maxScroll
  313.     end if
  314.   end if
  315.   call(#SetDraggerShift, ourControlList.dragger)
  316.   draggerData = call(#GetDraggerData, ourControlList.dragger)
  317.   myActiveZone = GetBarZone(me, draggerData)
  318. end
  319.  
  320. on PauseScroll me
  321.   myState = #paused
  322.   case myScrollRole of
  323.     #dragger:
  324.       SetTextScroll(me, myDraggerShift)
  325.     #upArrow, #downArrow:
  326.       mySprite.member = myStandardMember
  327.       if not myMultiThreading then
  328.         updateStage()
  329.       end if
  330.   end case
  331. end
  332.  
  333. on ResumeScroll me
  334.   myState = #Active
  335.   case myScrollRole of
  336.     #upArrow, #downArrow:
  337.       mySprite.member = myActiveMember
  338.   end case
  339.   UpdateScroll(me)
  340. end
  341.  
  342. on EndScroll me
  343.   case myScrollRole of
  344.     #dragger:
  345.       if not voidp(myInterimShift) then
  346.         if ourMaxScroll[1] then
  347.           myDraggerShift = myInterimShift
  348.         else
  349.           myDraggerShift = 0
  350.           ShiftDragger(me, myDraggerShift)
  351.         end if
  352.       end if
  353.       myInterimShift = VOID
  354.     #upArrow, #downArrow:
  355.       mySprite.member = myStandardMember
  356.       myNextUpdate = VOID
  357.   end case
  358.   myState = #done
  359. end
  360.  
  361. on SetTextScroll me, draggerShift
  362.   if ourMaxScroll[1] then
  363.     textScroll = draggerShift * ourMaxScroll[1] / myMaxDraggerShift
  364.     myScrolledMember.scrollTop = textScroll
  365.   else
  366.   end if
  367.   ShiftDragger(me, draggerShift)
  368. end
  369.  
  370. on SetDraggerShift me
  371.   maxScroll = ourMaxScroll[1]
  372.   if maxScroll then
  373.     textScroll = myScrolledMember.scrollTop
  374.     myDraggerShift = textScroll * myMaxDraggerShift / maxScroll
  375.   else
  376.     myDraggerShift = 0
  377.   end if
  378.   ShiftDragger(me, myDraggerShift)
  379. end
  380.  
  381. on ShiftDragger me, draggerShift
  382.   if not myMaxDraggerShift then
  383.     exit
  384.   end if
  385.   mySprite.loc = myZeroLoc + [0, draggerShift]
  386.   updateStage()
  387. end
  388.  
  389. on CustomScrollbar_SetScroll me, theScroll
  390.   case ilk(theScroll) of
  391.     #integer:
  392.     #float:
  393.       theScroll = integer(theScroll)
  394.     otherwise:
  395.       return #invalidTypeError
  396.   end case
  397.   theScroll = max(0, min(theScroll, ourMaxScroll[1]))
  398.   myScrolledMember.scrollTop = theScroll
  399.   call(#SetDraggerShift, ourControlList.dragger, theScroll)
  400. end
  401.  
  402. on CustomScrollbar_SwapMember me, newMember, currentMemberOrSprite
  403.   case ilk(newMember) of
  404.     #member:
  405.     #integer, #string:
  406.       memberExists = the number of member newMember > 0
  407.       if memberExists then
  408.         newMember = member(newMember)
  409.       else
  410.         return #memberInexistant
  411.       end if
  412.     otherwise:
  413.       return #invalidType
  414.   end case
  415.   case newMember.type of
  416.     #text, #field:
  417.     otherwise:
  418.       return #invalidMemberType
  419.   end case
  420.   case ilk(currentMemberOrSprite) of
  421.     #sprite:
  422.       if currentMemberOrSprite <> myScrolledSprite then
  423.         exit
  424.       end if
  425.     #member:
  426.       if currentMemberOrSprite <> myScrolledMember then
  427.         exit
  428.       end if
  429.   end case
  430.   myScrolledMember = newMember
  431.   idealRect = myRect
  432.   if myScrolledMember.type = #field then
  433.     hBorder = myScrolledMember.border
  434.     vBorder = hBorder - (hBorder <> 0)
  435.     hMargin = myScrolledMember.margin
  436.     vMargin = hMargin / 2
  437.     idealRect = inflate(idealRect, -hBorder - hMargin, -hBorder - vMargin)
  438.     if myRect[1] then
  439.       if hBorder then
  440.         idealRect[1] = idealRect[1] - 1
  441.       end if
  442.     else
  443.       if hBorder then
  444.         idealRect[1] = idealRect[1] - 1
  445.       end if
  446.     end if
  447.   end if
  448.   myScrolledMember.rect = idealRect
  449.   myScrolledSprite.member = myScrolledMember
  450.   myScrolledMember.boxType = #fixed
  451.   i = ourControlList.count()
  452.   repeat while i
  453.     call(#newMember, ourControlList[i])
  454.     i = i - 1
  455.   end repeat
  456.   updateStage()
  457.   call(#InstallElement, ourControlList.dragger)
  458. end
  459.  
  460. on CustomScrollbar_GetReference me, memberOrSprite, controlOrList
  461.   case ilk(memberOrSprite) of
  462.     #sprite:
  463.       if memberOrSprite <> myScrolledSprite then
  464.         exit
  465.       end if
  466.     #member:
  467.       if memberOrSprite <> myScrolledMember then
  468.         exit
  469.       end if
  470.     otherwise:
  471.       exit
  472.   end case
  473.   if not voidp(controlOrList) then
  474.     if ilk(controlOrList) = #propList then
  475.       controlOrList.addProp(myScrollRole, me)
  476.       return controlOrList
  477.     else
  478.       if controlOrList = myScrollRole then
  479.         return me
  480.       end if
  481.     end if
  482.   else
  483.     return me
  484.   end if
  485. end
  486.  
  487. on CustomScrollbar_RollCall me, scrolledElement, controlList, maxScrollList
  488.   if scrolledElement <> ourScrolledElement then
  489.     exit
  490.   end if
  491.   ourControlList = controlList
  492.   ourControlList.addProp(myScrollRole, me)
  493.   ourMaxScroll = maxScrollList
  494. end
  495.  
  496. on SpriteHeight me
  497.   return mySprite.height
  498. end
  499.  
  500. on spriteWIdth me
  501.   return mySprite.width
  502. end
  503.  
  504. on GetDraggerData me
  505.   return [#top: mySprite.top, #bottom: mySprite.bottom]
  506. end
  507.  
  508. on newMember me
  509.   myScrolledMember = myScrolledSprite.member
  510. end
  511.  
  512. on ErrorAlert me, theError, data
  513.   case theError of
  514.     #getPDLError:
  515.       permittedTypes = PermittedMemberTypes(me)
  516.       alert("Error: This behavior works only with the following member types:  " & permittedTypes & RETURN & RETURN & "Hit OK and then delete this behavior from the sprite." & RETURN & "For more information on deleting Behaviors, see the Help system.")
  517.       if the optionDown then
  518.         return [#getPDLError: [#comment: "ERROR:  Click 'Cancel'. Wrong member type.", #format: #string, #range: [EMPTY], #default: EMPTY]]
  519.       end if
  520.     #noScrollableSprites:
  521.       alert("Error: Please place a Field or Text member on the Stage before using this behavior to create a scroll bar." & RETURN & RETURN & "Hit OK and then delete this behavior from the sprite." & RETURN & "For more information on deleting Behaviors, see the Help system.")
  522.       if the optionDown then
  523.         return [#getPDLError: [#comment: "ERROR:   Click 'Cancel'.  Place a Text or Field" & RETURN & "member on Stage before creating scroll bar.", #format: #string, #range: [EMPTY], #default: EMPTY]]
  524.       end if
  525.     otherwise:
  526.       behaviorName = string(me)
  527.       delete word 1 of behaviorName
  528.       delete char -30001 of behaviorName
  529.       delete char -30001 of behaviorName
  530.       case data.ilk of
  531.         #void:
  532.           data = "<void>"
  533.         #symbol:
  534.           data = "#" & data
  535.       end case
  536.       if theError <> #getPDL_Invalid then
  537.         memberName = myScrolledMember.name
  538.         if memberName = EMPTY then
  539.           memberName = myScrolledMember
  540.         else
  541.           memberName = QUOTE & memberName & QUOTE
  542.         end if
  543.         memberName = myScrolledMember.type && memberName
  544.       end if
  545.       case theError of
  546.         #getPDL_Invalid:
  547.           alert("BEHAVIOR ERROR: Frame " & the frame & ", Sprite " & me.spriteNum & RETURN & RETURN & "Parameters for the " & behaviorName & "behavior have not been set." & RETURN & RETURN & "Please reopen the Behavior Parameters dialog and choose again.")
  548.           halt()
  549.         #notScrollable:
  550.           alert("BEHAVIOR ERROR: Frame " & the frame & ", Sprite " & me.spriteNum & RETURN & "Behavior " & behaviorName & RETURN & RETURN & "Sprite " & myScrolledSprite.spriteNum & " does not contain a Field or Text member." & RETURN & "Choose again in the Behavior Parameters dialog." & RETURN & RETURN & "Member type = " & data)
  551.           halt()
  552.         #extraControl:
  553.           if the runMode = "Author" then
  554.             alert("BEHAVIOR ERROR: Frame " & the frame & ", Sprite " & me.spriteNum & RETURN & "Behavior " & behaviorName & RETURN & RETURN & "There is more than one " & data & " sprite defined for the scroll bar for sprite " & myScrolledSprite.spriteNum & ", " & memberName & ".")
  555.           end if
  556.         #missingControls:
  557.           alert("BEHAVIOR ERROR: Frame " & the frame & ", Sprite " & me.spriteNum & RETURN & "Behavior " & behaviorName & RETURN & RETURN & "The following elements of the scroll bar for sprite " & myScrolledSprite.spriteNum & ", " & memberName & " are missing:" & RETURN & RETURN & data)
  558.           halt()
  559.       end case
  560.   end case
  561. end
  562.  
  563. on getPropertyDescriptionList me
  564.   if not (the currentSpriteNum) then
  565.     exit
  566.   end if
  567.   theMember = sprite(the currentSpriteNum).member
  568.   memberType = theMember.type
  569.   permittedTypes = PermittedMemberTypes(me)
  570.   if not permittedTypes.getPos(memberType) then
  571.     return ErrorAlert(me, #getPDLError, permittedTypes)
  572.   end if
  573.   scrollableList = GetScrollableSprites(me)
  574.   if not scrollableList.count then
  575.     return ErrorAlert(me, #noScrollableSprites)
  576.   end if
  577.   return [#myScrollRole: [#comment: "Current sprite acts as:", #format: #symbol, #range: [#upArrow, #downArrow, #dragger, #bar], #default: 1], #ourScrolledElement: [#comment: "Scroll the member of", #format: #string, #range: scrollableList, #default: scrollableList[1]], #myStandardMember: [#comment: "Standard member:", #format: #graphic, #default: theMember], #myActiveMember: [#comment: "(Arrows only) mouseDown member:", #format: #graphic, #default: theMember], #myMultiThreading: [#comment: "Allow animations to continue (slower)?", #format: #boolean, #default: 1]]
  578. end
  579.  
  580. on GetScrollableSprites me, permittedTypes
  581.   scrollableSprites = []
  582.   repeat with theSprite = 1 to the lastChannel
  583.     theMember = sprite(theSprite).member
  584.     case theMember.type of
  585.       #field, #text:
  586.         memberName = theMember.name
  587.         if memberName = EMPTY then
  588.           memberName = theMember
  589.         else
  590.           memberName = QUOTE & memberName & QUOTE
  591.         end if
  592.         memberName = theMember.type && memberName
  593.         scrollableSprites.append("sprite " & theSprite & ": " & memberName)
  594.     end case
  595.   end repeat
  596.   return scrollableSprites
  597. end
  598.  
  599. on PermittedMemberTypes me
  600.   return [#animgif, #bitmap, #filmLoop, #flash, #movie, #picture, #shape]
  601. end
  602.